package com.demo.common.utils;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

/**
 * 分布式锁工具类
 *
 * @author molong
 * @since 2023/1/9
 */
public class DistributedLockToolUtils {

    private final RLock rlock;
    private static RedissonClient redissonClient;

    /**
     * 设置redissonClient
     * @param redissonClient redisson客户端
     */
    public static void setRedissonClient(RedissonClient redissonClient) {
        DistributedLockToolUtils.redissonClient = redissonClient;
    }
    /**
     * 构造分布式锁工具类实例
     * @param lockKey   锁的键值
     * @param fairFlag  是否公平锁(true-是,false-不是)
     */
    private DistributedLockToolUtils(String lockKey, boolean fairFlag) {
        if (fairFlag) {
            rlock = redissonClient.getFairLock(lockKey);
        } else {
            rlock = redissonClient.getLock(lockKey);
        }
    }

    /**
     * 创建分布式锁工具类实例
     * @param lockKey 锁的键值
     * @return 结果
     */
    public static DistributedLockToolUtils build(String lockKey) {
        return build(lockKey, false);
    }

    /**
     * 创建分布式锁工具类实例
     * @param lockKey 锁的键值
     * @param fairFlag  是否公平锁(true-是,false-不是)
     * @return 结果
     */
    public static DistributedLockToolUtils build(String lockKey, boolean fairFlag) {
        return new DistributedLockToolUtils(lockKey, fairFlag);
    }
    /**
     * 加锁
     */
    public void lock() {
        rlock.lock();
    }

    /**
     * 释放锁，只能释放当前线程拥有的锁
     */
    public void unlock() {
        rlock.unlock();
    }
}
